home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / docs / corsoguide / task-10.txt < prev    next >
Text File  |  1992-09-03  |  4KB  |  77 lines

  1. I processi (task)
  2.  
  3. Un task (o processo in italiano) dovrebbe essere oramai chiaro a tutti cosa
  4. sia, infatti altro non è che un programma (in inglese vuol dire lavoro o
  5. mansione); dato che il s.o. dell'Amiga è multitasking appare ovvio, che più
  6. task possono essere attivi contemporeanemente e quindi risulta logico che
  7. il programma principale possa attivare un secondo task che procede
  8. parallelamente. Un task è identificato da una struttura denominata "Task"
  9. che mantiene tutte le informazioni relative alla creazione ed alla vita del
  10. processo; è possibile ottenere il puntatore a tale struttura del task in
  11. esecuzione mediante la chiamata:
  12.  
  13. processo = FindTask(NULL);
  14.  
  15. il task in esecuzione di cui verrà ritornato il valore "processo" puntatore
  16. alla struttura Task, è sicuramente quello che esegue la chiamata alla
  17. funzione appena vista; se si vuole ricerca un task in particolare, bisogna
  18. invece specificare la stringa indicante il nome che lo identifica nella
  19. lista.
  20. Per la creazione di un processo occorre allocare la memoria della
  21. struttura Task mediante AllocMem con attributi MEMF_CLEAR e MEM_PUBLIC; in
  22. tal modo la struttura verrà inizializzata con zero e sarà di tipo
  23. condivisibile; i campi da inizializzare della struttura Task dipendono da
  24. come intendi utilizzare il processo; nel caso più semplice occorre
  25. inizializzare i seguenti campi:
  26. tc_Node - dato che il processo verrà inserito nella lista dei task del
  27.           sistema occorre inizializzare il nodo con le informazioni relative
  28.           alla priorità, il tipo ed il nome.
  29. tc_SPLower - il limite di memoria inferiore dello stack del task
  30. tc_SPUpper - il limite di memoria superiore dello stack
  31. tc_SPReg - il valore iniziale dello stack pointer (SP)
  32. bisogna porre a zero tutti gli altri campi (ma allocando la
  33. memoria della struttura con MEMF_CLEAR viene già fatto).
  34. Una volta che la struttura Task è inizializzata il processo può essere reso
  35. attivo con AddTask:
  36.  
  37. AddTask(processo,PCiniziale,PCfinale);
  38.  
  39. dove "processo" è il puntatore alla struttura Task contenente i dati
  40. relativi alla creazione del task; PCiniziale è l'indirizzo della prima
  41. istruzione del task da eseguire e PCfinale è l'indirizzo della procedura che
  42. verrà eseguita all'uscita del task (con PCfinale uguale a NULL ne viene
  43. implementata una standard di exec); dalla versione 2 del s.o. AddTask
  44. ritorna l'indirizzo del task o NULL in caso in cui l'operazione ha fallito.
  45. Per rimuovere il task (che potrebbe essere già stato rimosso nel caso la sua
  46. esecuzione sia giunta al termine) occorre utilizzare RemTask:
  47.  
  48. RemTask(processo);
  49.  
  50. Lo stesso lavoro per la creazione di un task può essere effettuata con una
  51. singola chiamata a CreateTask (una macro di amiga.lib):
  52.  
  53. processo = (struct Task *)CreateTask(nome,priorità,PCiniziale,grandstack);
  54.  
  55. dove "nome" è il nome che avrà il task nella lista, "priorità" è la sua
  56. priorità, "PCiniziale" l'indirizzo della prima istruzione del task e
  57. "grandstack" la grandezza in bytes dello stack per il task; occorre far
  58. attenzione alla grandezza dello stack (che con AddTask deve essere allocato
  59. dal programma, mentre con CreateTask è fatto automaticamente) perché questo
  60. non solo dipende dalla quantità di dati che vengono posti sullo stack dal
  61. suo task, ma anche dal s.o., poiché nel task-switching i registri del task
  62. congelato vengono memorizzati proprio nel suo stack per essere poi ripresi
  63. quando verrà riattivato (si consiglia un minimo di 256 bytes); per
  64. "eliminare" un task creato con CreateTask prima del suo tempo occorre
  65. eseguire DeleteTask:
  66.  
  67. DeleteTask(processo);
  68.  
  69. Fare attenzione che prima che un task venga eliminato, tutte le risorse
  70. allocate da quest'ultimo (memoria, librerie ecc.) devono essere liberate;
  71. per maggior sicurezza conviene che, tutte le risorse che necessitano al
  72. task figlio (quello da creare) vengano allocate dal task padre (il processo
  73. che crea il task figlio).
  74. Abbiamo ultimato l'argomento dei task anche se vi sono altre importanti
  75. caratteristiche come il trattamento dei traps del task che vedremo
  76. eventualmente di trattare in un articolo a parte.
  77.